home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_gnu / include / dpmi.h < prev    next >
C/C++ Source or Header  |  1996-01-30  |  5KB  |  152 lines

  1. /* This is file dpmi.h */
  2. /*
  3. ** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  4. **
  5. ** This file is distributed under the terms listed in the document
  6. ** "copying.dj", available from DJ Delorie at the address above.
  7. ** A copy of "copying.dj" should accompany this file; if not, a copy
  8. ** should be available from where this file was obtained.  This file
  9. ** may not be distributed without a verbatim copy of "copying.dj".
  10. **
  11. ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
  12. ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. */
  14.  
  15. #ifndef _DPMI_H_
  16. #define _DPMI_H_
  17.  
  18.  
  19. #include <sys/types.h>
  20.  
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24.  
  25. typedef union {
  26.   struct {
  27.     u_long edi;
  28.     u_long esi;
  29.     u_long ebp;
  30.     u_long res;
  31.     u_long ebx;
  32.     u_long edx;
  33.     u_long ecx;
  34.     u_long eax;
  35.   } d;
  36.   struct {
  37.     u_short di, di_hi;
  38.     u_short si, si_hi;
  39.     u_short bp, bp_hi;
  40.     u_short res, res_hi;
  41.     u_short bx, bx_hi;
  42.     u_short dx, dx_hi;
  43.     u_short cx, cx_hi;
  44.     u_short ax, ax_hi;
  45.     u_short flags;
  46.     u_short es;
  47.     u_short ds;
  48.     u_short fs;
  49.     u_short gs;
  50.     u_short ip;
  51.     u_short cs;
  52.     u_short sp;
  53.     u_short ss;
  54.   } x;
  55.   struct {
  56.     u_char edi[4];
  57.     u_char esi[4];
  58.     u_char ebp[4];
  59.     u_char res[4];
  60.     u_char bl, bh, ebx_b2, ebx_b3;
  61.     u_char dl, dh, edx_b2, edx_b3;
  62.     u_char cl, ch, ecx_b2, ecx_b3;
  63.     u_char al, ah, eax_b2, eax_b3;
  64.   } h;
  65. } _go32_dpmi_registers;
  66.  
  67. typedef struct {
  68.   u_long  size;
  69.   u_long  pm_offset;
  70.   u_short pm_selector;
  71.   u_short rm_offset;
  72.   u_short rm_segment;
  73. } _go32_dpmi_seginfo;
  74.  
  75. typedef struct {
  76.   u_long available_memory;
  77.   u_long available_pages;
  78.   u_long available_lockable_pages;
  79.   u_long linear_space;
  80.   u_long unlocked_pages;
  81.   u_long available_physical_pages;
  82.   u_long total_physical_pages;
  83.   u_long free_linear_space;
  84.   u_long max_pages_in_paging_file;
  85.   u_long reserved[3];
  86. } _go32_dpmi_meminfo;
  87.  
  88. /* returns zero if success, else dpmi error and info->size is max size */
  89. int _go32_dpmi_allocate_dos_memory(_go32_dpmi_seginfo *info);
  90.     /* set size to bytes/16, call, use rm_segment.  Do not
  91.        change anthing but size until the memory is freed.
  92.        If error, max size is returned in size as bytes/16. */
  93. int _go32_dpmi_free_dos_memory(_go32_dpmi_seginfo *info);
  94.     /* set new size to bytes/16, call.  If error, max size
  95.        is returned in size as bytes/16 */
  96. int _go32_dpmi_resize_dos_memory(_go32_dpmi_seginfo *info);
  97.     /* uses pm_selector to free memory */
  98.  
  99. /* These both use the rm_segment:rm_offset fields only */
  100. int _go32_dpmi_get_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
  101. int _go32_dpmi_set_real_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
  102.  
  103. /* These do NOT wrap the function in pm_offset in an iret handler.
  104.    You must provide an assembler interface yourself, or alloc one below.
  105.    You may NOT longjmp out of an interrupt handler. */
  106. int _go32_dpmi_get_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
  107.     /* puts vector in pm_selector:pm_offset. */
  108. int _go32_dpmi_set_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
  109.     /* sets vector from pm_offset and pm_selector */
  110. int _go32_dpmi_chain_protected_mode_interrupt_vector(int vector, _go32_dpmi_seginfo *info);
  111.     /* sets up wrapper that calls function in pm_offset, chaining to old
  112.        handler when it returns */
  113.  
  114. /* These can be used to generate assember IRET-style wrappers for functions */
  115. int _go32_dpmi_allocate_iret_wrapper(_go32_dpmi_seginfo *info);
  116.     /* Put function ptr in pm_offset, call, returns wrapper entry in pm_offset. */
  117. int _go32_dpmi_free_iret_wrapper(_go32_dpmi_seginfo *info);
  118.     /* assumes pm_offset points to wrapper, frees it */
  119.  
  120. /* simulate real mode calls.  CS:IP from regs for non-interrupt */
  121. int _go32_dpmi_simulate_int(int vector, _go32_dpmi_registers *regs);
  122. int _go32_dpmi_simulate_fcall(_go32_dpmi_registers *regs);
  123. int _go32_dpmi_simulate_fcall_iret(_go32_dpmi_registers *regs);
  124.  
  125. /* These automatically handle the tasks of restructuring the
  126.    real-mode stack for the proper return type.  The callback
  127.    (info->pm_offset) is called as (*pmcb)(_go32_dpmi_registers *regs); */
  128. int _go32_dpmi_allocate_real_mode_callback_retf(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
  129.     /* points callback at pm_offset, returns seg:ofs of callback addr
  130.        in rm_segment:rm_offset.  Do not change any fields until freed.
  131.        Interface is added to simulate far return */
  132. int _go32_dpmi_allocate_real_mode_callback_iret(_go32_dpmi_seginfo *info, _go32_dpmi_registers *regs);
  133.     /* same, but simulates iret */
  134. int _go32_dpmi_free_real_mode_callback(_go32_dpmi_seginfo *info);
  135.     /* frees callback */
  136.  
  137. /* Only available_memory is guaranteed to be valid.  Try
  138.    available_physical_pages for phys mem left */
  139. int _go32_dpmi_get_free_memory_information(_go32_dpmi_meminfo *info);
  140.  
  141. /* Convenience functions.  These use the above memory info call.
  142.    The return value is *bytes* */
  143. u_long _go32_dpmi_remaining_physical_memory(void);
  144. u_long _go32_dpmi_remaining_virtual_memory(void);
  145.  
  146.  
  147. #ifdef __cplusplus
  148. }
  149. #endif
  150.  
  151. #endif
  152.